<html>
    <head>
        <title>对象映射</title>
    </head>
    <body>
        <script>
            /*
                        三、对象映射

                                        上面的CreateAsync方法从给定的CreateBookDto对象手动创建一个Book实体，因为Book实体强制执行它（我们是这样设计的）。

                                        然而，在许多情况下，使用自动对象映射从类似对象设置对象的属性非常实用。

                                        ABP提供了一个对象到对象映射基础架构来使这变得更加容易。

                                        对象到对象的映射提供抽象，默认情况下由AutoMapper库实现。



                                        让我们创建另一个方法来获取一本书。首先，在IBookAppService接口中定义方法：

                                                    public interface IBookAppService : IApplicationService
                                                    {
                                                        Task CreateAsync(CreateBookDto input);

                                                        Task<BookDto> GetAsync(Guid id); //New method
                                                    }

                                        BookDto是一个简单的DTO类，定义如下：

                                                    public class BookDto
                                                    {
                                                        public Guid Id { get; set; }

                                                        public string Name { get; set; }

                                                        public BookType Type { get; set; }

                                                        public float? Price { get; set; }
                                                    }

                                        AutoMapper需要创建一个映射文档类。例子：

                                                    public class MyProfile : Profile
                                                    {
                                                        public MyProfile()
                                                        {
                                                            CreateMap<Book, BookDto>();
                                                        }
                                                    }

                                        然后，你应该使用AbpAutoMapperOptions注册配置文件：

                                                    [DependsOn(typeof(AbpAutoMapperModule))]
                                                    public class MyModule : AbpModule
                                                    {
                                                        public override void ConfigureServices(ServiceConfigurationContext context)
                                                        {
                                                            Configure<AbpAutoMapperOptions>(options =>
                                                            {
                                                                // 将MyModule 所在程序集的所有映射配置添加到AutoMapper中。
                                                                options.AddMaps<MyModule>();
                                                            });
                                                        }
                                                    }

                                        AddMaps注册在给定类的程序集中定义的所有配置文件类，通常是你的模块类。它还注册属性映射。

                                        然后可以实现GetAsync方法，如下所示：

                                                    public async Task<BookDto> GetAsync(Guid id)
                                                    {
                                                        var book = await _bookRepository.GetAsync(id);
                                                        return ObjectMapper.Map<Book, BookDto>(book);
                                                    }

                                        有关更多信息，请参阅"对象映射文档":https://abp.io/docs/latest/framework/infrastructure/object-to-object-mapping

                    */
        </script>
    </body>
</html>